// internal/apps/apps.go
package apps

import (
	"fmt"
	"star-go-app/internal/apps/auth"

	"github.com/gin-gonic/gin"
)

// AppInfo 应用信息结构
type AppInfo struct {
	Description string        // 应用描述
	NewModule   func() Module // 创建模块实例的函数
}

// Name 获取应用名称（从模块实例自动获取）
func (app *AppInfo) Name() string {
	module := app.NewModule()
	return module.Name()
}

// INSTALLED_APPS 已安装的应用列表
// 新增应用时，只需要在这里添加应用信息即可
var INSTALLED_APPS = []AppInfo{
	{
		Description: "用户认证模块",
		NewModule:   func() Module { return auth.NewModule() },
	},
	// 添加新应用时在这里添加
	// {
	//     Description: "用户管理模块",
	//     NewModule:   func() Module { return user.NewModule() },
	// },
	// {
	//     Description: "订单管理模块",
	//     NewModule:   func() Module { return order.NewModule() },
	// },
}

// GetInstalledApps 获取已安装的应用列表
func GetInstalledApps() []AppInfo {
	return INSTALLED_APPS
}

// GetAppNames 获取应用名称列表
func GetAppNames() []string {
	names := make([]string, len(INSTALLED_APPS))
	for i, app := range INSTALLED_APPS {
		names[i] = app.Name()
	}
	return names
}

// GetAppByName 根据名称获取应用信息
func GetAppByName(name string) (*AppInfo, error) {
	for _, app := range INSTALLED_APPS {
		if app.Name() == name {
			return &app, nil
		}
	}
	return nil, fmt.Errorf("未找到应用: %s", name)
}

// CreateModuleByName 根据应用名称创建模块实例
func CreateModuleByName(name string) (Module, error) {
	app, err := GetAppByName(name)
	if err != nil {
		return nil, err
	}
	return app.NewModule(), nil
}

// IsAppInstalled 检查应用是否已安装
func IsAppInstalled(name string) bool {
	_, err := GetAppByName(name)
	return err == nil
}

// Module 应用模块接口
type Module interface {
	Name() string
	RegisterRoutes(router *gin.RouterGroup)
	Initialize() error
}
